const { Schema, model, connect, Types } = require("mongoose");
const { MONGODB_CONNECTION_URL, DEFAULT_IAMGE } = require("../config");

connect(MONGODB_CONNECTION_URL)
.then(() => console.log("数据库连接成功"))
.catch(err => console.log("数据库连接失败", err))

// 用户表模型
const User = model("User", new Schema(
    {
        nickname: String,               // 昵称 
        phone: String,                  // 电话
        password: String,               // 密码
        upvote: {                       // 点赞数量
            type: Number,
            default: 0
        },
        socketId: {                     // 聊天用 id
            type: String,
            default: "",
        },
        headImgUrl: {
            type: String,
            default: DEFAULT_IAMGE,
        },
        cover: {                        // 封面
            type: String,
            default: DEFAULT_IAMGE,
        },
        draft: {                        // 这个id指向用户当前编辑的动态的草稿
            type: Schema.Types.ObjectId,
            ref: "DynamicContent",
            default: null,
        },
        DynamicList: [                  // 动态列表
            {               
                type: Schema.Types.ObjectId,
                ref: "DynamicContent",
            }
        ],
        applications: [                 // 好友申请列表
            {
                type: Schema.Types.ObjectId,
                ref: "friend_request"
            }
        ], 
        joinedGroups: [
            {
                type: Schema.Types.ObjectId,
                ref: "groupChat"
            }
        ],
    },
    { timestamps: true },               // 自动添加时间戳
));

// 好友申请模型
const friend_request = model("friend_request", new Schema(
    {
        sender: {                      // 申请者的用户 ID
            type: Schema.Types.ObjectId, 
            ref: "User" 
        },
        receiver: {                     // 被申请者的用户 ID
            type: Schema.Types.ObjectId, 
            ref: "User" 
        },
        status: {                       // 申请状态，0 为待接受，1 为已接受，2 为已拒绝
            type: Number,
            default: 0
        },
        time: Date,                     // 好友申请的时间
        postscript: String,             // 好友申请的附言
    }
));

// 好友表模型
const friendList = model("friendList", new Schema(
    {
        phone: String,                      // 改表所属用户的 phone
        friends: [
            {
                friendId: {                 // 好友的用户 ID
                    type: Schema.Types.ObjectId,
                    ref: "User"
                },
                remark: String,       // 好友的备注名
                friendGroup: String,        // 好友的分组名
                messages: [Schema.Types.Mixed]
            }
        ],
    }
));

// friendList.create({
//     phone: '17769385074',
//     friends: [
//         { friendId: '676e82287d76b7882aec99fc' },
//         { friendId: '676e82287d76b7882aec99fd' },
//         { friendId: '676e82287d76b7882aec99fe' }
//     ]
// })

// friendList.create({
//     phone: '17769380562',
//     friends: [
//         { friendId: '676e82287d76b7882aec99fb' },
//     ]
// })

// 群聊模型
const groupChat = model("groupChat", new Schema(
    {
        groupName: {                // 群聊的名称
            type: String,
            required: true
        },
        groupAvatar: {              // 群聊的头像链接
            type: String,
            default: "/file/images/OIP-C.jpg"
        },    
        createTime: {               // 记录群聊的创建时间
            type: Date,
            default: Date.now
        },
        description: String,        // 群聊的描述信息
        owner: {                    // 群主的用户 ID
            type: Schema.Types.ObjectId,
            ref: 'User',
            required: true
        },
        members: [                  // 群成员的用户 ID 数组
            {
                type: Schema.Types.ObjectId,
                ref: 'User'
            }
        ],
        joinRequests: [             // 存储加入群聊的请求信息
            {
                requester: {        // 请求者的用户 ID
                    type: Schema.Types.ObjectId,
                    ref: 'User'
                },
                requestTime: {      // 请求时间
                    type: Date,
                    default: Date.now
                }
            }
        ],
        lastMessage: String,        // 群聊的最后一条消息内容，用于在群聊列表中展示最新消息。
        lastMessageTime: Date,      // 最后一条消息的发送时间，用于排序和展示群聊的活跃度
        messages: [Schema.Types.Mixed],
        messageCount: {             // 群聊中的消息总数，方便统计和分页加载消息。
            type: Number,
            default: 0
        },
        isPublic: {                 // 表示群聊是否为公开群，公开群可被搜索和加入，私密群需要邀请才能加入。
            type: Boolean,
            default: false
        },
        isMuted: {                  // 群聊是否被静音，成员可以选择静音群聊以避免消息打扰。
            type: Boolean,
            default: false
        },
        maxMembers: {               // 群聊的最大成员数量，用于限制群聊的规模。
            type: Number,
            default: 500
        },
    }
));

// groupChat.create({
//     groupName: "蛋蛋的群聊",
//     owner: "676e82287d76b7882aec99fb",
//     members: [
//         "676e82287d76b7882aec99fc",
//         "676e82287d76b7882aec99fd",
//         "676e82287d76b7882aec99fe"
//     ]
// })

// 用户【动态】数据模型
const DynamicContent = model("DynamicContent", new Schema(
    {
        phone: String,                          // 哪个用户发的
        text: String,                           // 动态文字内容
        time: Date,                             // 动态发表的时间
        imageUrls: [String],                    // 图片url地址
        liked_users: [{
            type: Schema.Types.ObjectId,
            ref: "User"
        }],
        comment: [{
            user: {
                type: Schema.Types.ObjectId,
                ref: "User"
            },
            content: String,
        }]
    }
));

// 群通知模型
const GroupNotification = model("GroupNotification", new Schema(
    {
        recipient: {                      // 接收者的用户ID
            type: Schema.Types.ObjectId,
            ref: "User",
            required: true
        },
        groupId: {                        // 相关的群聊ID
            type: Schema.Types.ObjectId,
            ref: "groupChat",
            required: true
        },
        type: {                           // 通知类型：invitation(邀请), system(系统通知)
            type: String,
            enum: ['invitation', 'system'],
            default: 'invitation'
        },
        inviterId: {                       // 邀请者的用户ID
            type: Schema.Types.ObjectId,
            ref: "User"
        },
        content: String,                  // 通知内容
        status: {                         // 通知状态：pending(待处理), accepted(已接受), rejected(已拒绝), expired(已过期)
            type: String,
            enum: ['pending', 'accepted', 'rejected', 'expired'],
            default: 'pending'
        },
        createTime: {                     // 创建时间
            type: Date,
            default: Date.now
        },
        isRead: {                         // 是否已读
            type: Boolean,
            default: false
        }
    },
    { timestamps: true }
));

// 需要在现有的群聊模型中添加群公告相关字段
groupChat.schema.add({
    announcement: {                   // 群公告
        type: String,
        default: ''
    },
    announcementUpdateTime: {         // 群公告更新时间
        type: Date,
        default: null
    },
    announcementUpdater: {            // 群公告更新者
        type: Schema.Types.ObjectId,
        ref: 'User',
        default: null
    }
});

module.exports = {
    User,
    friendList,
    groupChat,
    DynamicContent,
    friend_request,
    GroupNotification
}
